iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
生成式 AI

使用 Spring AI 打造企業 RAG 知識庫系列 第 6

使用 Spring AI 打造企業 RAG 知識庫【6】- 懶得打字問 AI?用提示詞範本吧

  • 分享至 

  • xImage
  •  

Garbage in garbage out

https://ithelp.ithome.com.tw/upload/images/20240810/201612907PBWefpaFK.jpg

Garbage in garbage out也適用在AI,有些人就是不知如何問 AI,得到的解答自然也不具參考價值,這時提示詞範本就派上用場了

▋樣板提示詞

我們可以預設一些提示詞,只需將關鍵字換掉即可,下面是一個簡單的範例

@GetMapping(value = "/template1")
public String template1(@RequestParam String llm) {	
    String template = "請問{llm}目前有哪些模型,各有甚麼特殊能力";
    PromptTemplate promptTemplate = new PromptTemplate(template);
    Prompt prompt = promptTemplate.create(Map.of("llm", llm));
    ChatResponse response = chatModel.call(prompt);
    return response.getResult().getOutput().getContent();
}

程式重點說明

  • template 中包含一個{llm},可以在建立 Prompt 時替換
  • PromptTemplate 就是提示詞範本類別,若 template 中有可替換的字串( 前一點的 {llm} ),可在執行 create 時傳入Map替換,若有多個變數需替換就傳入多組 Map
  • PromptTemplate 可以使用 create 得到 Prompt 物件,也可以使用 createMessage 得到 Message 物件,這部分取決於後面要如何應用

▋驗收成果

看看 Postman 測試得到的結果
https://ithelp.ithome.com.tw/upload/images/20240804/201612908Nov6aIOo8.png

可以看到我們只需輸入 openai,AI 就能依據我們定義的模板來詢問,甚至能依特定格式產出結果

▋外部檔案匯入提示詞

有時模板太長打在程式裡不美觀也不容易維護,PromptTemplate 也支援使用 Resource 讀取文字檔
首先在 resources 目錄下建立一個文字檔: prompt.st 內容就是上個範例的模板字串
https://ithelp.ithome.com.tw/upload/images/20240804/20161290QOFt2ocS0C.png

程式碼改成如下

	@Value("classpath:prompt.st")
	private Resource templateResource;
	
	@GetMapping(value = "/template2")
	public String template2(@RequestParam String llm) {	
		PromptTemplate promptTemplate = new PromptTemplate(templateResource);
		Prompt prompt = promptTemplate.create(Map.of("llm", llm));
		ChatResponse response = chatModel.call(prompt);
		return response.getResult().getOutput().getContent();
	}

這樣看起來是不是簡潔許多?

▋多參數提示詞

最後我們來寫一個演算法產生器,查詢時只需輸入程式語言以及需要的演算法,AI 就能給我們詳細的程式以及說明了
先在 resources 增加一個 code.st,內容放入

language {language}
method {methodName}
請提供 language 語言的 method 範例,並提供詳細的中文說明

透過RequestParam傳入參數

因為上面有兩個需替換的字串,程式碼需要有兩個 @RequestParam

	@GetMapping(value = "/template3")
	public String template3(@RequestParam String language, @RequestParam String methodName) {	

多參數傳入提示詞範本

由於有兩個參數,建立 Prompt 也需要傳入兩個 Map

Prompt prompt = promptTemplate.create(Map.of("language", language, "methodName",methodName));

最終程式碼(演算法產生器)

最終程式碼如下

	@Value("classpath:code.st")
	private Resource templateResource2;
	
	@GetMapping(value = "/template3")
	public String template3(@RequestParam String language, @RequestParam String methodName) {	
		PromptTemplate promptTemplate = new PromptTemplate(templateResource2);
		Prompt prompt = promptTemplate.create(Map.of("language", language, "methodName",methodName));
		ChatResponse response = chatModel.call(prompt);
		return response.getResult().getOutput().getContent();
	}

▋驗收成果

來看看執行結果(中間程式碼太長,將其省略,完整內容可自行測試)
https://ithelp.ithome.com.tw/upload/images/20240804/20161290r0eIQoDsDx.png
https://ithelp.ithome.com.tw/upload/images/20240804/201612902JzcltxIPy.png

還記得昨天提到 Message 有四種嗎?PromptTemplate 產出的 Prompt 預設就是使用 UserMessage 建立,Spring AI 也同時準備了其他三個 Message 的 PromptTemplate
https://ithelp.ithome.com.tw/upload/images/20240804/20161290sJLPWTlUKT.png

▋回顧

今天學到甚麼

  • 使用 PromptTemplate 將模板字串的關鍵字換為輸入的內容再去 AI 查詢結果
  • PromptTemplate 使用 Resource 讀取存於檔案中的模板字串

▋Source Code

今日的原始碼:
https://github.com/kevintsai1202/SpringBoot-AI-Day6.git


▋認識凱文大叔

凱文大叔使用 Java 開發程式超過 20 年,對於 Java 生態非常熟悉,曾使用反射機制開發 ETL 框架,對 Spring 背後的原理非常清楚,目前以 Spring Boot 作為後端開發框架,前端使用 React 搭配 Ant Design
下班之餘在 Amazing Talker 擔任程式語言講師,並獲得學員的一致好評

最近剛成立一個粉絲專頁-凱文大叔教你寫程式 歡迎大家多追蹤,我會不定期分享實用的知識以及程式開發技巧

想討論 Spring 的 Java 開發人員可以加入 FB 討論區 Spring Boot Developer Taiwan

我是凱文大叔,歡迎一起加入學習程式的行列


上一篇
使用 Spring AI 打造企業 RAG 知識庫【5】- 深入瞭解 ChatModel
下一篇
使用 Spring AI 打造企業 RAG 知識庫【7】- 如何跟 ChatGPT 一樣處理多模態資料
系列文
使用 Spring AI 打造企業 RAG 知識庫35
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言